# This Python file uses the following encoding: utf-8
import sys

from PyQt5 import QtCore
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QBrush, QColor
from PyQt5.QtWidgets import QApplication, QMainWindow, QHBoxLayout, QTableWidgetItem, QHeaderView, QAbstractItemView, \
    QPushButton, QMenu

from mainwindow import Ui_DOE
from todosapp.TodoWindow import TodoWindow


# 调用主窗口显示
class BootstrapWindow(QMainWindow, Ui_DOE):
    def __init__(self, parent=None):
        super(BootstrapWindow, self).__init__(parent)

        self.setupUi(self)

        self.init_wafer_table()

        self.todoWindow = TodoWindow()

        cb = self.CloseBtn
        cb.setStyleSheet("background-color: red")
        cb.clicked.connect(self.close)  # 信号 connect 槽

    def init_wafer_table(self):
        wafer_table = self.tableWidget
        # 4行
        wafer_table.setRowCount(20)
        # 3列
        wafer_table.setColumnCount(4)
        # 水平头标签，注意：必须先初始化行数和列数
        wafer_table.setHorizontalHeaderLabels(['A', 'B', 'C', 'Op'])
        wafer_table.verticalHeader().setVisible(False)
        # 设置表头自动占满表的全部宽度
        wafer_table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
        # 只读
        wafer_table.setEditTriggers(QAbstractItemView.NoEditTriggers)
        # 点击一个位置后选中一整行
        wafer_table.setSelectionBehavior(QAbstractItemView.SelectRows)

        # 第一行第一个单元格
        new_item = QTableWidgetItem("Joseph")
        wafer_table.setItem(0, 0, new_item)

        # 第一行第二个单元格
        new_item = QTableWidgetItem('man')
        wafer_table.setItem(0, 1, new_item)

        # 第一行第三个单元格
        new_item = QTableWidgetItem('140')
        wafer_table.setItem(0, 2, new_item)

        # 第一行第四个单元格，按钮
        search_btn = QPushButton('Modify')
        search_btn.setDown(True)  # 按钮置为已按下的状态（深色）
        wafer_table.setCellWidget(0, 3, search_btn)

        # 循环创建单元格 19行 4列
        for i in range(1, 20):  # 1到19 不包含20
            for j in range(0, 4):  # 0到3 不包含4
                wafer_table.setItem(i, j, QTableWidgetItem(str(i) + "-" + str(j)))

        # 按第3列内容的字典序排序
        wafer_table.sortItems(2, QtCore.Qt.SortOrder.AscendingOrder)

        # 自定义上下文菜单
        wafer_table.setContextMenuPolicy(Qt.CustomContextMenu)
        wafer_table.customContextMenuRequested.connect(self.generate_wafer_table_menu)

        # 布局
        con_layout = QHBoxLayout()
        con_layout.addWidget(wafer_table)
        self.setLayout(con_layout)

    def quick_locate(self):
        """
        快速定位到包含指定文本的第一个单元格所在的行
        :return: row_num 行号
        """
        _row_num = -1

        text = '5-2'
        items = self.tableWidget.findItems(text, QtCore.Qt.MatchFlag.MatchExactly | QtCore.Qt.MatchFlag.MatchContains)

        # list 判空和校验长度
        if items is not None and len(items) > 0:
            item = items[0]
            # 单元格的行号
            _row_num = item.row()
            # 选中单元格
            item.setSelected(True)
            # 设置单元格内容颜色
            item.setForeground(QBrush(QColor(255, 0, 0)))
            print(f'找到包含指定字符串的第一个单元格的行索引（从0开始）：{_row_num}')
        else:
            print('未找到包含指定字符串的单元格')
        return _row_num

    def quick_locate_scroll_to_row(self, _row_num):
        """
        快速定位到指定索引号的行
        :param _row_num:
        :return:
        """
        if _row_num >= 0:
            self.tableWidget.verticalScrollBar().setSliderPosition(_row_num)
            print(f'滚动条滑动到第{_row_num + 1}行')

    @staticmethod
    def handle_item_click(item):
        print('选中的单元格文本 =>' + item.text())

    def generate_wafer_table_menu(self, pos):
        """
        表格组件右键菜单
        :param pos:
        :return:
        """
        _row_num = -1
        # TODO for循环重复赋值给 _row_num ？取表格最后一行的索引？
        for i in self.tableWidget.selectionModel().selection().indexes():
            _row_num = i.row()

        print('*******' + _row_num)

        if _row_num >= 0:
            menu = QMenu()
            opt1 = menu.addAction(u'选项a')
            opt2 = menu.addAction(u'选项b')
            opt3 = menu.addAction(u'选项c')
            action = menu.exec(self.tableWidget.mapToGlobal(pos))  # todo what is mapToGlobal？
            if action == opt1:
                print('你选中了选项a，当前行文字内容是：',
                      self.tableWidget.item(_row_num, 0).text(),
                      self.tableWidget.item(_row_num, 1).text(),
                      self.tableWidget.item(_row_num, 2).text(),
                      self.tableWidget.item(_row_num, 3).text(),
                      )
            elif action == opt2:
                print('你选中了选项b，当前行文字内容是：',
                      self.tableWidget.item(_row_num, 0).text(),
                      self.tableWidget.item(_row_num, 1).text(),
                      self.tableWidget.item(_row_num, 2).text(),
                      self.tableWidget.item(_row_num, 3).text(),
                      )
            elif action == opt3:
                print('你选中了选项c，当前行文字内容是：',
                      self.tableWidget.item(_row_num, 0).text(),
                      self.tableWidget.item(_row_num, 1).text(),
                      self.tableWidget.item(_row_num, 2).text(),
                      self.tableWidget.item(_row_num, 3).text(),
                      )
            else:
                return

    def show_new_window(self):
        self.todoWindow.show()


if __name__ == "__main__":
    app = QApplication(sys.argv)

    window = BootstrapWindow()
    window.show()

    row_num = window.quick_locate()

    window.quick_locate_scroll_to_row(row_num)

    # 点击单元格触发Bootstrap类的处理方法打印
    window.tableWidget.itemClicked.connect(window.handle_item_click)

    window.show_new_window()

    sys.exit(app.exec())
